﻿Type.registerNamespace("MoniMisi2");

MoniMisi2.Texto = function(element) {
    MoniMisi2.Texto.initializeBase(this, [element]);
    this.Funciones = new MoniMisi2.Funciones();
    this.value = null;
    this.DelOnKeyPress = Function.createDelegate(this, this.OnKeyPress);
    this.DelOnKeyDown = Function.createDelegate(this, this.OnKeyDown);
    this.DelValidar = Function.createDelegate(this, this.Validar);
    this.Texto = null;
    this.CssError = null;
    this.CssCorrecto = null;
    this.Defecto = null;
    this.Mascara = null;
    this.Mandos = null;
    this.FuncionMascara = null;
    this.AceptaBlanco = null;
    this.Separador = null;
    this.Espacios = "";
    this.NoKeyPress = false;
    this.DelValida = null;
    this.AlMenosUno=false;
};

MoniMisi2.Texto.prototype = {

    initialize: function() {
        MoniMisi2.Texto.callBaseMethod(this, 'initialize');
        this.Mandos = "!¡9X"
        this.Texto = this._element
        this.DelValida = Function.createDelegate(this, this.ValidaFormato);
        $addHandler(this.Texto, "keydown", this.DelOnKeyDown);
        $addHandler(this.Texto, "keypress", this.DelOnKeyPress);
        $addHandler(this.Texto, "blur", this.DelValidar);
        this.add_Validando(this.DelValida)

        this.CssCorrecto = this.Texto.className
        for (c = 0; c < this.Mascara.length; c += 1) { this.Espacios += " " }
        this.Texto.value = this.PonerSeparadores(this.Defecto + this.Espacios);
        this.Funciones.InitValidarControl(this);
        //this.Validar();
    },
    dispose: function() {
        MoniMisi2.Texto.callBaseMethod(this, 'dispose');
    },

    CorrerFunciones: function() {
        for (f = 0; f < this.FuncionMascara.length; f += 1) {
            switch (this.FuncionMascara[f].Nombre) {
                case 0: //AlinearDerecha
                    var SinSeparadores = this.QuitarSeparadores(this.Texto.value)
                    var LargoLimpio = SinSeparadores.length
                    SinSeparadores = SinSeparadores.replace(/\s+$/, "")
                    this.Texto.value = this.PonerSeparadores(this.Espacios.substr(0, LargoLimpio - SinSeparadores.length) + SinSeparadores)
                    break;
                case 1: //AlinearIzquierda
                    var SinSeparadores = this.QuitarSeparadores(this.Texto.value)
                    var LargoLimpio = SinSeparadores.length
                    SinSeparadores = SinSeparadores.replace(/^\s+/, "")
                    this.Texto.value = this.PonerSeparadores(SinSeparadores + this.Espacios.substr(0, LargoLimpio - SinSeparadores.length))
                    break;
                case 2: //RellenarConCeros
                    for (n = 0; n < this.Mascara.length; n += 1) {
                        if (this.Mascara.substr(n, 1) == "9" && this.Texto.value.substr(n, 1) == " ") {
                            this.Texto.value = this.Texto.value.substr(0, n) + "0" + this.Texto.value.substr(n + 1)
                        }
                    }
                    break;
            }
        }
    },

    EsObligatorio: function(pPos) {
        return this.AceptaBlanco.substr(pPos, 1) == "1";
    },
    Validar: function() {
        this.CorrerFunciones();
        for (n = 0; n < this.Mascara.length; n += 1) {
            if (!this.EsSeparador(n)) {
                var Caracter = this.EsPermitido(n, this.Texto.value.substr(n, 1).charCodeAt())
                if (Caracter != null && this.Texto.value.substr(n, 1) != Caracter) {
                    this.Texto.value = this.Texto.value.substr(0, n) + Caracter + this.Texto.value.substr(n + 1)
                }
            }
        };
        this.value = this.Texto.value;
        this.Funciones.ValidarControl(this, this.value);
    },

    ValidaFormato: function(sender, e) {
        var Error = false;
        for (n = 0; n < sender.Mascara.length; n += 1) {
            if (!sender.EsSeparador(n)) {
                var Caracter = sender.EsPermitido(n, e.Valor.substr(n, 1).charCodeAt())
                if (Caracter == null) {
                    Error = true;
                    e.Mensajes.push('el formato es erroneo')
                    break;
                } else {
                    if (e.Valor.substr(n, 1) == " " && sender.EsObligatorio(n)) {
                        Error = true;
                        e.Mensajes.push('el formato es erroneo')
                        break;
                    }
                }
            }
        }
        if (this.AlMenosUno && e.Valor.replace(/ /g, "").length == 0) {
            Error = true;
            e.Mensajes.push('no puede ser blanco')
        }
        if (Error) {
            e.Erroneo = true;
        }
    },

    ProximoEditable: function(pPosActual, pDireccion) {

        if (pDireccion == "D") {
            for (Posi = pPosActual + 1; Posi < this.Mascara.length; Posi = Posi + 1) {
                if (this.Mandos.indexOf(this.Mascara.substr(Posi, 1)) != -1) {
                    break;
                }
            }
        } else {
            for (Posi = pPosActual - 1; Posi >= 0; Posi = Posi - 1) {
                if (this.Mandos.indexOf(this.Mascara.substr(Posi, 1)) != -1) {
                    break;
                }
            };
        };
        return (Posi > this.Mascara.length ? this.Mascara.length : Posi);
    },

    ProximoSeparador: function(pPos) {
        for (n = pPos; n < this.Mascara.length; n = n + 1) {
            if (this.EsSeparador(n)) {
                break;
            }
        }
        return n
    },

    QuitarSeparadores: function(pValor) {
        var Retorno = ""
        for (n = 0; n < this.Mascara.length; n = n + 1) {
            if (!this.EsSeparador(n)) {
                Retorno = Retorno + pValor.substr(n, 1);
            }
        }
        return Retorno
    },

    PonerSeparadores: function(pValor) {
        var Retorno = ""
        for (n = 0; n < this.Mascara.length; n = n + 1) {
            if (!this.EsSeparador(n)) {
                Retorno = Retorno + pValor.substr(n, 1);
            } else {
                Retorno = Retorno + this.Mascara.substr(n, 1);
                pValor = " " + pValor;
            }
        }
        return Retorno
    },

    EsSeparador: function(pPos) {
        return (this.Mandos.indexOf(this.Mascara.substr(pPos, 1)) == -1);
    },
    EsPermitido: function(pPos, pTecla) {
        var Retorno = null;
        switch (this.Mascara.substr(pPos, 1)) {
            case '!':
                if ((pTecla >= 65 && pTecla <= 90) || (pTecla >= 97 && pTecla <= 122) || pTecla == 32) {
                    Retorno = String.fromCharCode(pTecla).toUpperCase();
                }
                break;
            case '¡':
                if ((pTecla >= 65 && pTecla <= 90) || (pTecla >= 97 && pTecla <= 122) || pTecla == 32) {
                    Retorno = String.fromCharCode(pTecla).toLowerCase();
                }
                break;
            case 'X':
                Retorno = String.fromCharCode(pTecla);
                break;
            case '9':
                if ((pTecla >= 48 && pTecla <= 57) || pTecla == 32) {
                    Retorno = String.fromCharCode(pTecla);
                }
                break;
        }
        return Retorno;
    },

    OnKeyDown: function(e) {
        this.NoKeyPress = false;
        var MovimientosPermitidos = ",8,9,127,39,37,35,36,";
        evento = (e || window.event);
        var Tecla = evento.keyCode;
        var PosCur = this.PosicionCursor(this.Texto)
        var EsSeparador = this.EsSeparador(PosCur)
        var EsMovimiento = (MovimientosPermitidos.indexOf("," + Tecla + ",") != -1)
        if (EsMovimiento) {
            switch (Tecla) {
                case 9: //Tab
                    break;
                case 8: // Backspace
                    var Seleccionado = this.Seleccion(this.Texto)
                    if (Seleccionado.Largo == 0) {
                        PosCur = this.ProximoEditable(PosCur, "I")
                        if (PosCur == -1) {
                            PosCur = 0;
                            this.CancelarEvento(e)
                            break;
                        }
                        this.Texto.value = this.Texto.value.substring(0, PosCur) + " " + this.Texto.value.substring(PosCur + 1);
                    } else {
                        this.LimpiarSeleccionValor(this.Texto);
                    }
                    this.PosicionarCursor(this.Texto, PosCur);
                    return this.CancelarEvento(e)
                    break;
                case 127: // Delete
                    var Seleccionado = this.Seleccion(this.Texto)
                    if (Seleccionado.Largo == 0) {
                        if (EsSeparador) {
                            PosCur = this.ProximoEditable(PosCur, "D")
                        }
                        var ProximoSeparador = this.ProximoSeparador(PosCur)
                        var Texto = this.Texto.value.substring(PosCur, ProximoSeparador)
                        Texto = Texto.substring(1) + " ";
                        this.Texto.value = this.Texto.value.substring(0, PosCur) + Texto + this.Texto.value.substring(ProximoSeparador);
                    } else {
                        this.LimpiarSeleccionValor(this.Texto);
                    }
                    this.PosicionarCursor(this.Texto, PosCur);
                    return this.CancelarEvento(e)
                    break;
                case 39: // Derecha
                    if (!e.shiftKey) {
                        PosCur = this.ProximoEditable(PosCur, "D")
                        this.PosicionarCursor(this.Texto, PosCur);
                        this.CancelarEvento(e)
                    }
                    break;
                case 37: // Izquierda
                    if (!e.shiftKey) {
                        PosCur = this.ProximoEditable(PosCur, "I")
                        this.PosicionarCursor(this.Texto, PosCur);
                        return this.CancelarEvento(e)
                    }
                    break;
                case 36: // Inicio
                    if (!e.shiftKey) {
                        PosCur = 0;
                        this.PosicionarCursor(this.Texto, PosCur);
                        return this.CancelarEvento(e)
                    }
                    break;
                case 35: // End
                    if (!e.shiftKey) {
                        PosCur = this.Mascara.length - 1
                        this.PosicionarCursor(this.Texto, PosCur);
                        return this.CancelarEvento(e)
                    }
                    break;
            }
            return true
        }
    },

    CancelarEvento: function(e) {
        e.preventDefault();
        e.stopPropagation();
        e.returnValue = false;
        e.cancelBubble = true
        this.NoKeyPress = true;
        return false;
    },

    OnKeyPress: function(e) {
        if (!this.NoKeyPress) {
            evento = (e || window.event);
            var Tecla = evento.rawEvent.keyCode ? evento.rawEvent.keyCode : evento.rawEvent.which;
            if (Tecla == 9) { return true }
            var PosCur = this.PosicionCursor(this.Texto)
            var EsSeparador = this.EsSeparador(PosCur)

            var Caracter = null
            if (!EsSeparador) {
                Caracter = this.EsPermitido(PosCur, Tecla);
            } else {

                PosCur = this.ProximoEditable(PosCur, "D")
                Caracter = this.EsPermitido(PosCur, Tecla);
                this.PosicionarCursor(this.Texto, PosCur);

            }


            if (Caracter != null) {
                var Seleccionado = this.Seleccion(this.Texto)
                if (Seleccionado.Largo != 0) {
                    this.LimpiarSeleccionValor(this.Texto);
                }
                if (PosCur == this.Mascara.length) {
                    e.preventDefault();
                } else {
                    if (this.EsSeparador(PosCur)) {
                        PosCur = this.ProximoEditable(PosCur, "D")
                    }
                    this.Texto.value = this.Texto.value.substring(0, PosCur) + Caracter + this.Texto.value.substring(PosCur + 1);
                    PosCur = this.ProximoEditable(PosCur, "D");
                    this.PosicionarCursor(this.Texto, PosCur);
                    e.preventDefault();
                }
            } else {
                e.preventDefault()
            }
        } else {
            e.preventDefault();
        }
    },


    LimpiarSeleccionValor: function(pTexto) {
        var Seleccionado = this.Seleccion(pTexto)
        var Parte = ""
        for (n = 0; n < Seleccionado.Largo; n += 1) {
            if (!this.EsSeparador(Seleccionado.Inicio - 1 + n)) {
                Parte = Parte + " "
            } else {
                Parte = Parte + pTexto.value.substr(Seleccionado.Inicio - 1 + n, 1);
            }
        }
        pTexto.value = pTexto.value.substring(0, Seleccionado.Inicio - 1) + Parte + pTexto.value.substring(Seleccionado.Inicio - 1 + Seleccionado.Largo);
    },


    PosicionCursor: function(pTexto) {

        if (document.selection && !window.getSelection) {
            var rango = document.selection.createRange().duplicate()
            rango.moveEnd('character', pTexto.value.length)
            if (rango.text == '') return pTexto.value.length
            return pTexto.value.lastIndexOf(rango.text)
        } else {
            return pTexto.selectionStart
        }


    },

    PosicionarCursor: function(pTexto, pPos) {

        if (document.selection && !window.getSelection) {
            var rango = pTexto.createTextRange();
            rango.move('character', pPos);
            rango.select();
        } else {
            pTexto.focus();
            pTexto.setSelectionRange(pPos, pPos);
        }
    },

    Seleccion: function Seleccion(pTexto) {
        if (document.selection && !window.getSelection) {
            var rango = document.selection.createRange().duplicate();
            var LargoSeleccion = rango.text.length;
            rango.moveEnd('character', pTexto.value.length);
            return { Inicio: pTexto.value.lastIndexOf(rango.text) + 1, Largo: LargoSeleccion };
        } else {
            return { Inicio: pTexto.selectionStart + 1, Largo: pTexto.selectionEnd - pTexto.selectionStart };
        }
    },

    get_value: function() {
        return this.QuitarSeparadores(this.value);

    },

    set_value: function(value) {
        if (value != undefined) {
            if (this.value !== value) {
                this.Texto.value = this.PonerSeparadores(value);
                this.Validar();
                this.raisePropertyChanged('value');
            }
        }
    },

    get_CssError: function() {
        return this.CssError;
    },

    set_CssError: function(value) {
        if (this.CssError !== value) {
            this.CssError = value;
            this.raisePropertyChanged('CssError');
        }
    },
    get_Defecto: function() {
        return this.Defecto;
    },

    set_Defecto: function(value) {
        if (this.Defecto !== value) {
            this.Defecto = value;
            this.raisePropertyChanged('Defecto');
        }
    },
    get_Mascara: function() {
        return this.Mascara;
    },

    set_Mascara: function(value) {
        if (this.Mascara !== value) {
            this.Mascara = value;
            this.raisePropertyChanged('Mascara');
        }
    },
    get_FuncionMascara: function() {
        return this.FuncionMascara;
    },

    set_FuncionMascara: function(value) {
        if (this.FuncionMascara !== value) {
            this.FuncionMascara = value;
            this.raisePropertyChanged('FuncionMascara');
        }
    },


    get_AceptaBlanco: function() {
        return this.AceptaBlanco;
    },

    set_AceptaBlanco: function(value) {
        if (this.AceptaBlanco !== value) {
            this.AceptaBlanco = value;
            this.raisePropertyChanged('AceptaBlanco');
        }
    },

    get_AlMenosUno: function() {
        return this.AlMenosUno;
    },

    set_AlMenosUno: function(value) {
        if (this.AlMenosUno !== value) {
            this.AlMenosUno = value;
            this.raisePropertyChanged('AlMenosUno');
        }
    },
    add_Validando: function(handler) {
        this.get_events().addHandler('Validando', handler);
    },
    remove_Validando: function(handler) {
        this.get_events().removeHandler('Validando', handler);
    }
}

MoniMisi2.Texto.registerClass('MoniMisi2.Texto', Sys.UI.Control);

if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();